package org.xx.armory.rpc.routing;

import java.util.Objects;

import static org.apache.commons.lang3.StringUtils.equalsIgnoreCase;
import static org.apache.commons.lang3.StringUtils.substring;
import static org.apache.commons.lang3.Validate.notNull;
import static org.apache.commons.text.StringEscapeUtils.escapeJava;

/**
 * 表示路由中的纯文本部分。
 */
final class RouteText
        extends RouteToken {
    private final String content;

    /**
     * 构造路由中的纯文本部分。
     *
     * @param content
     *         文本内容。
     * @throws IllegalArgumentException
     *         如果参数{@code content}是{@code null}。
     */
    public RouteText(String content) {
        super("", RouteTokenType.TEXT);

        this.content = notNull(content);
    }

    /**
     * 获取文本部分的值。
     *
     * @return 文本部分的值。
     */
    public String getContent() {
        return this.content;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    final String match(
            String url,
            int pos
    ) {
        assert (url != null);

        final String pt = substring(url, pos, pos + content.length());
        final int cl = content.length();
        final boolean mo;
        if (cl > 0 && (pt.length() == cl - 1) && content.charAt(cl - 1) == '/') {
            mo = equalsIgnoreCase(pt + '/', content);
        } else {
            mo = equalsIgnoreCase(pt, content);
        }
        return mo ? pt : null;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode() {
        return Objects.hash(this.content);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (obj.getClass() != this.getClass()) {
            return false;
        }

        final RouteText other = (RouteText) obj;
        return Objects.equals(this.content, other.content);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String toString() {
        return '"' + escapeJava(this.getContent()) + '"';
    }

}
